import { launchDouyin, start } from '@/modules';
import Fudai from '@/modules/Fudai';
import LiveRoom from '@/modules/LiveRoom';
import SettingsManager from '@config/settings';
import LogManager from '@utils/LogManager';
import floatyManager from './FloatyManager';

let timer: ReturnType<typeof setInterval> | null = null;

interface Error {
  message: string;
}

/**
 * UI管理类
 * 负责管理应用的所有UI相关操作，包括:
 * 1. 初始化UI界面
 * 2. 设置按钮样式
 * 3. 绑定事件处理
 * 4. 更新UI状态
 */
class UIManager {
  /** UI是否已经准备就绪 */
  private isUIReady: boolean = false;
  /** 存储工作线程 */
  private workThread: any = null;

  /**
   * 初始化UI界面
   * 包括设置状态栏、加载布局、初始化组件等
   */
  initUI(): void {
    // 设置状态栏为沉浸式
    activity.getWindow().setStatusBarColor(colors.parseColor('#FFFFFF'));
    activity
      .getWindow()
      .getDecorView()
      .setSystemUiVisibility(
        android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | android.view.View.SYSTEM_UI_FLAG_LAYOUT_STABLE | android.view.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR,
      );

    // 加载外部布局文件
    ui.layoutFile('./src/ui/layout.xml');

    // 初始化UI
    setTimeout(() => {
      this.setupButtonStyles();
      this.initializeState();
      this.bindEvents();
      
      // 设置收款码图片路径
      if (ui.wechatQRCode) {
        const wechatPath = files.path('./dist/assets/wechat.jpg');
        ui.wechatQRCode.attr('src', 'file://' + wechatPath);
      }
      if (ui.alipayQRCode) {
        const alipayPath = files.path('./dist/assets/alipay.jpg');
        ui.alipayQRCode.attr('src', 'file://' + alipayPath);
      }
      
      this.isUIReady = true;
    }, 100);
  }

  /**
   * 设置按钮样式
   * 为开始和停止按钮添加渐变背景和水波纹效果
   */
  private setupButtonStyles(): void {
    try {
      // 设置按钮渐变背景和点击效果
      const createGradientButton = (button: any, startColor: string, endColor: string) => {
        if (!button) return;

        const drawable = new android.graphics.drawable.GradientDrawable(android.graphics.drawable.GradientDrawable.Orientation.LEFT_RIGHT, [
          colors.parseColor(startColor),
          colors.parseColor(endColor),
        ]);
        drawable.setCornerRadius(28 * device.density);

        // 添加水波纹效果
        const rippleDrawable = new android.graphics.drawable.RippleDrawable(android.content.res.ColorStateList.valueOf(colors.parseColor('#20000000')), drawable, null);
        button.setBackground(rippleDrawable);
      };

      if (ui.startBtn) createGradientButton(ui.startBtn, '#4CAF50', '#66BB6A');
      if (ui.stopBtn) createGradientButton(ui.stopBtn, '#F44336', '#EF5350');
    } catch (e: unknown) {
      if (e instanceof Error) {
        LogManager.error('设置按钮样式失败: ' + e.message);
      }
    }
  }

  /**
   * 初始化UI状态
   * 设置初始文本和按钮状态，加载保存的设置
   */
  private initializeState(): void {
    try {
      // 初始化UI状态
      if (ui.statusText) ui.statusText.setText('已停止');
      if (ui.countText) ui.countText.setText('0');
      if (ui.startBtn) ui.startBtn.setEnabled(true);
      if (ui.stopBtn) ui.stopBtn.setEnabled(false);

      // 加载保存的设置
      SettingsManager.load();
      LogManager.setUIReady();
    } catch (e: unknown) {
      if (e instanceof Error) {
        LogManager.error('初始化UI状态失败: ' + e.message);
      }
    }
  }

  /**
   * 绑定事件处理
   * 为所有按钮和控件添加事件监听器
   */
  private bindEvents(): void {
    try {
      // 绑定按钮事件
      if (ui.startBtn) {
        ui.startBtn.on('click', () => {
          SettingsManager.loadFromUI();
          this.setRunningState(true);
          LogManager.add('服务已启动');
          
          // 获取最新的设置
          const settings = SettingsManager.getSettings();
          console.log('当前启动设置:', settings);
          
          // 在新线程中执行启动任务
          this.workThread = threads.start(function() {
            launchDouyin();
            timer = setInterval(start, 1000);
          });
        });
      }

      if (ui.stopBtn) {
        ui.stopBtn.on('click', () => {
          this.setRunningState(false);
          
          const self = this;  // 保存 this 引用
          // 在新线程中执行停止任务
          threads.start(function() {
            // 清除定时器
            if (timer) {
              clearInterval(timer);
              Fudai.resetState();
              LiveRoom.resetCurrentLive();
              timer = null;
            }
            // 结束工作线程
            if (self.workThread && self.workThread.isAlive()) {
              self.workThread.interrupt();
              self.workThread = null;
            }
            LogManager.add('服务已停止');
          });
        });
      }

      if (ui.clearLogBtn) {
        ui.clearLogBtn.on('click', () => LogManager.clear());
      }

      if (ui.saveLogBtn) {
        ui.saveLogBtn.on('click', () => LogManager.save());
      }

      // 悬浮窗开关
      if (ui.floatyBtn) {
        ui.floatyBtn.on('click', () => {
          // 检查悬浮窗权限
          if (!floatyManager.checkPermission()) {
            LogManager.error('请先授予悬浮窗权限');
            return;
          }

          try {
            if (floatyManager.isShowing()) {
              floatyManager.hide();
              ui.floatyBtn.setText('显示悬浮窗');
            } else {
              floatyManager.show();
              ui.floatyBtn.setText('隐藏悬浮窗');
            }
          } catch (e: unknown) {
            if (e instanceof Error) {
              LogManager.error('悬浮窗操作失败: ' + e.message);
            }
          }
        });
      }
    } catch (e: unknown) {
      if (e instanceof Error) {
        LogManager.error('绑定事件失败: ' + e.message);
      }
    }
  }

  /**
   * 设置运行状态
   * @param isRunning 是否正在运行
   */
  private setRunningState(isRunning: boolean): void {
    if (!this.isUIReady) return;

    ui.run(() => {
      try {
        if (ui.startBtn) ui.startBtn.setEnabled(!isRunning);
        if (ui.stopBtn) ui.stopBtn.setEnabled(isRunning);
        if (ui.statusText) ui.statusText.setText(isRunning ? '运行中' : '已停止');
      } catch (e: unknown) {
        if (e instanceof Error) {
          LogManager.error('更新运行状态失败: ' + e.message);
        }
      }
    });
  }

  /**
   * 更新状态文本
   * @param status 状态文本
   */
  updateStatus(status: string): void {
    if (!this.isUIReady) return;

    ui.run(() => {
      try {
        if (ui.statusText) ui.statusText.setText(status);
      } catch (e: unknown) {
        if (e instanceof Error) {
          LogManager.error('更新状态失败: ' + e.message);
        }
      }
    });
  }
}

// 导出UIManager的单例实例
export default new UIManager();
